package com.tpp.threat_perception_platform.utils;

import java.util.Arrays;
import java.lang.System;
import java.util.List;

import com.alibaba.dashscope.aigc.generation.Generation;
import com.alibaba.dashscope.aigc.generation.GenerationParam;
import com.alibaba.dashscope.aigc.generation.GenerationResult;
import com.alibaba.dashscope.common.Message;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.InputRequiredException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.fastjson.JSON;
import com.tpp.threat_perception_platform.pojo.Account;
import com.tpp.threat_perception_platform.pojo.HostLog;
import com.tpp.threat_perception_platform.pojo.Hotfix;
import com.tpp.threat_perception_platform.pojo.Service;

public class Ai {
    public static GenerationResult accountAi(List<Account> accounts) throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();
        String tipMsg ="# 角色\n" +
                "你是一位资深的数据分析师，在处理Windows账户数据方面拥有深厚的专业知识和极为丰富的实践经验。用户会提供Windows账户数据（json格式），你需凭借精湛的专业能力，对每条数据进行精确、细致且全面的分析，依据特定规则为每条数据的riskLevel字段判定为高、中、低三个等级中的一个，并在该数据后面添加一个字段ai_result，此字段要用清晰、准确的中文详细存放对该条数据的分析结果。最终以纯文本形式输出数据。\n" +
                "\n" +
                "## 技能\n" +
                "### 技能 1: 精确分析并添加字段与定级\n" +
                "1. 接收用户提供的Windows账户数据（json格式）。\n" +
                "2. 运用扎实的专业知识和丰富经验，从多个维度对每条数据展开深入剖析，确保分析全面且准确。依据特定规则为每条数据的riskLevel字段自动判定为高、中、低三个等级中的一个，再将以中文表述的精确分析结果存放在新增的ai_result字段中。\n" +
                "3. 仔细检查数据的完整性和准确性，以纯文本形式输出包含新增字段以及riskLevel字段定级后的完整数据。\n" +
                "\n" +
                "## 限制:\n" +
                "- 仅围绕用户提供的Windows账户数据进行分析和处理，不涉及任何其他无关话题。\n" +
                "- 最终输出必须为纯文本形式，且ai_result字段中的内容必须是清晰、准确、逻辑严谨的中文。 \n" +
                "- riskLevel字段的定级只能为高、中、低三个等级，需遵循特定的规则。 ";
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content(tipMsg)
                .build();
        String msg = JSON.toJSONString(accounts);
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content(msg)
                .build();
        GenerationParam param = GenerationParam.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为：.apiKey("sk-xxx")
                .apiKey("sk-c693f0ed415b422e9595c7f019601a15")
                // 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        GenerationResult result = gen.call(param);
        return result;
    }

    public static GenerationResult serviceAi(List<Service> services) throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();
        String tipMsg ="# 角色\n" +
                "你是一位资深的Windows服务数据分析师，凭借深厚专业知识和丰富经验，擅长依据提供的Windows服务相关数据开展精准风险评估和全面总结分析，并能按要求完善数据。\n" +
                "\n" +
                "## 技能\n" +
                "### 技能 1: 分析并完善数据\n" +
                "1. 接收到一组Windows的服务相关数据（以纯文本形式呈现的JSON格式）后，仔细深入剖析每条数据。\n" +
                "2. 运用专业风险评估体系，根据数据中的端口、服务名称等关键信息，精准判断每条数据对应的风险等级（高、中、低三个等级，以中文表述），并添加到数据的“risk_level”字段。\n" +
                "3. 基于对数据的详尽分析，给出合理且具针对性的建议或总结（以中文表述），添加到数据的“ai_result”字段。\n" +
                "4. 最后以纯文本的JSON格式输出，数据格式需严格与传入的数据格式保持一致。\n" +
                "\n" +
                "## 限制:\n" +
                "- 仅处理与Windows服务相关的数据，拒绝处理与该主题无关的数据。\n" +
                "- 整个输出的数据必须以纯文本的JSON格式呈现，且格式与传入数据格式完全一致。\n" +
                "- 风险等级判断需基于扎实专业知识，建议或总结需紧密依据给定的数据内容。 \n" +
                "- 确保risk_level和ai_result的内容为中文纯文本。 ";
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content(tipMsg)
                .build();
        String msg = JSON.toJSONString(services);
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content(msg)
                .build();
        GenerationParam param = GenerationParam.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为：.apiKey("sk-xxx")
                .apiKey("sk-c693f0ed415b422e9595c7f019601a15")
                // 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        GenerationResult result = gen.call(param);
        return result;
    }

    public static GenerationResult hotfixAi(List<Hotfix> hotfixes) throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();
        String tipMsg ="# 角色\n" +
                "你是一位专业的Windows补丁数据分析师，擅长对Windows补丁相关数据进行深入分析并给出合理建议。\n" +
                "\n" +
                "## 技能\n" +
                "### 技能 1: 分析并给出建议\n" +
                "1. 接收用户提供的一组Windows的补丁相关数据（json格式），例如：[{\"macAddress\": \"2C:6D:C1:5F:89:FC\", \"hotfixId\": \"KB5054979\"}, {\"macAddress\": \"2C:6D:C1:5F:89:FC\", \"hotfixId\": \"KB5060842\"}, {\"macAddress\": \"2C:6D:C1:5F:89:FC\", \"hotfixId\": \"KB5059502\"}]。\n" +
                "2. 根据你的知识储备，对数据进行分析并给出合理建议。\n" +
                "3. 将分析和建议结果放入一个新的字段ai_result中。\n" +
                "4. 最终输出和用户上传数据一样的json格式，且是纯文本，没有任何代码标识符。\n" +
                "\n" +
                "## 限制:\n" +
                "- 只处理与Windows补丁相关的数据，拒绝处理其他无关数据。\n" +
                "- 输出内容必须为json格式的纯文本，且按照用户提供的数据结构要求进行组织。\n" +
                "- 分析和建议应基于专业知识和经验，确保合理性和准确性。 ";
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content(tipMsg)
                .build();
        String msg = JSON.toJSONString(hotfixes);
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content(msg)
                .build();
        GenerationParam param = GenerationParam.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为：.apiKey("sk-xxx")
                .apiKey("sk-c693f0ed415b422e9595c7f019601a15")
                // 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        GenerationResult result = gen.call(param);
        return result;
    }

    public static GenerationResult hostLogAi(List<HostLog> hostLogs) throws ApiException, NoApiKeyException, InputRequiredException {
        Generation gen = new Generation();
        String tipMsg ="# 角色\n" +
                "你是一位资深的Windows日志数据分析专家，凭借深厚的专业知识和丰富的经验，擅长对Windows日志数据展开全面且深入的剖析，并能依据分析结果给出精准合理的结论以及风险等级评估。\n" +
                "\n" +
                "## 技能\n" +
                "### 技能 1: 分析Windows日志数据\n" +
                "1. 当接收到用户提供的Windows日志数据（json格式）时，若数据量过多，挑选其中几条关键的事件记录（重点关注包含event_id、timestamp、macAddress、SubjectUserSid、SubjectUserName等参数的记录）进行仔细分析。若数据量正常，则对所有记录进行分析。\n" +
                "2. 根据分析得出合理的结论，将结论放入新增英文字段“ai_result”中，内容为中文。\n" +
                "3. 依据分析情况，确定英文风险等级（High、Medium、Low），并将对应的中文风险等级（高、中、低）放入新增英文字段“risk_level”中。\n" +
                "\n" +
                "### 技能 2: 输出数据\n" +
                "1. 将生成的结果以json格式输出，格式需和用户上传的数据一致，要求纯文本，无额外的代码标识符。\n" +
                "\n" +
                "## 限制:\n" +
                "- 仅基于用户提供的Windows日志数据进行分析，不回答与该日志数据分析无关的问题。\n" +
                "- 输出结果必须严格按照要求的json格式和字段进行组织，不能偏离框架要求。";
        Message systemMsg = Message.builder()
                .role(Role.SYSTEM.getValue())
                .content(tipMsg)
                .build();
        String msg = JSON.toJSONString(hostLogs);
        Message userMsg = Message.builder()
                .role(Role.USER.getValue())
                .content(msg)
                .build();
        GenerationParam param = GenerationParam.builder()
                // 若没有配置环境变量，请用阿里云百炼API Key将下行替换为：.apiKey("sk-xxx")
                .apiKey("sk-c693f0ed415b422e9595c7f019601a15")
                // 模型列表：https://help.aliyun.com/zh/model-studio/getting-started/models
                .model("qwen-plus")
                .messages(Arrays.asList(systemMsg, userMsg))
                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
                .build();
        GenerationResult result = gen.call(param);
        return result;
    }
}
